﻿<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

if(!CModule::IncludeModule("iblock"))
{
    ShowError("Модуль Информационных блоков не установлен");
    return;
}

if (!$USER->IsAuthorized())
{
    ShowError("Вы должны авторизоваться, чтобы иметь возможность создавать заявки.");
    return;        
}

if (!(CSite::InGroup(array($arParams["GROUP_CLIENTS"])) || CSite::InGroup(array($arParams["GROUP_ADMINS"])) || CSite::InGroup(array($arParams["GROUP_PERFORMERS"]))))
{
    ShowError("У Вас нет доступа к заявкам. Обратитесь в отдел ИТО для предоставления Вам доступа.");
    return;        
}

$arResult = array();

$arResult["ERROR"] = "";
$arResult["SUCCESS"] = "";

$arResult["ISADMIN"] = CSite::InGroup(array($arParams["GROUP_ADMINS"]));
$arResult["ISPERFORMER"] = CSite::InGroup(array($arParams["GROUP_PERFORMERS"]));
$arResult["ISCLIENT"] = CSite::InGroup(array($arParams["GROUP_CLIENTS"]));

if ($_SERVER["REQUEST_METHOD"]=="POST")
{
//echo "<pre>";
//print_r($_REQUEST);
//print_r($_FILES);

    if ($_REQUEST["FORMTYPE"]=="newrequest")
    {
        if ($_REQUEST["category"])
        {
            $uid = $USER->GetID();
            $uname = $USER->GetFullName();
            $umail = $USER->GetEmail();
            $LOGTXT = "";

            // если сотрудник ТП и задано от кого заявка - меняем переменную $uid
            if ($arResult["ISADMIN"] || $arResult["ISPERFORMER"])
            {
                if ($_REQUEST["author"]>0)
                {
                    $uid = $_REQUEST["author"];
                    $LOGTXT .= "<li>заявку от имени пользователя создал ".$uname."</li>";                
                }
            }
            
            // записываем категорию в лог
            $pitem = GetIBlockElement($_REQUEST["category"]);
            $LOGTXT .= "<li>категория: ".$pitem["NAME"]."</li>";
            $cat_name = $pitem["NAME"];
            
            // выбираем свойства инфоблока для определения типа комментария
            $types = array();
            $prs = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$arParams["IBLOCK_REQUESTS_LOGS_ID"], "CODE"=>"TYPE"));
            while($field = $prs->GetNext())
            {
                $types[$field["VALUE"]] = $field["ID"];
            }                
            
            // выбрать ответственного пользователя по умолчанию
            $arFilter = array(
                "IBLOCK_TYPE" => $arParams["IBLOCK_HANDBOOKS_TYPE"],
                "IBLOCK_ID"=> $arParams["IBLOCK_HANDBOOKS_CATEGORY"],
                "ID"=> $_REQUEST["category"],
                "ACTIVE" => "Y",
            );            
            $rsElement = CIBlockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, array("nTopCount"=>"1"), array("ID", "PROPERTY_DEFAULT_RESPONSIBLE"));
            if ($elem = $rsElement->GetNext())
            {
                $user = $elem["PROPERTY_DEFAULT_RESPONSIBLE_VALUE"];
                $rsUser = CUser::GetByID($user);
                $pitem = $rsUser->Fetch();
                $resp_name = $pitem["NAME"]." ".$pitem["LAST_NAME"];
                $tp_email = $pitem["EMAIL"];
                $LOGTXT .= "<li>ответственный: ".$resp_name."</li>";                
            }
            else
            {
                $user = "";
                $resp_name = "";
                // выбираем всех пользователей техподдержки
                $filter = Array("GROUPS_ID" => Array($arParams["GROUP_PERFORMERS"]));
                $rsUsers = CUser::GetList(($by="last_name"), ($order="asc"), $filter);         
                $tp_email = "";
                while ($res = $rsUsers->GetNext())
                {
                    $tp_email .= $res["EMAIL"].", ";
                }
            }
            
            // выбираем админов техподдержки для отправки копий сообщений
            $filter = Array("GROUPS_ID" => Array($arParams["GROUP_ADMINS"]));
            $rsUsers = CUser::GetList(($by="last_name"), ($order="asc"), $filter);         
            $tp_admin_email = "";
            while ($res = $rsUsers->GetNext())
            {
                $tp_admin_email .= $res["EMAIL"].", ";
            }
            
            
            // выбрать первый статус по сортировке если назначен ответственный
            if (strlen($user))
            {
                $arFilter = array(
                    "IBLOCK_TYPE" => $arParams["IBLOCK_HANDBOOKS_TYPE"],
                    "IBLOCK_ID"=> $arParams["IBLOCK_HANDBOOKS_STATUSES"],
                    "ACTIVE" => "Y",
                );
                $rsElement = CIBlockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, array("nTopCount"=>"1"), array("ID", "NAME"));
                if ($elem = $rsElement->GetNext())
                {
                    $status = $elem["ID"];
                    $LOGTXT .= "<li>статус: ".$elem["NAME"]."</li>";
                }
                else
                    $status = "";
            }
            else
                $status = "";
            
            // определение критичности и записи в лог
            if ($_REQUEST["criticality"])
            {
                $pitem = GetIBlockElement($_REQUEST["criticality"]);
                $LOGTXT .= "<li>критичность: ".$pitem["NAME"]."</li>";
                $crit_name = $pitem["NAME"];
            }
            else
                $crit_name = "";

            if ($arParams["USE_PROJECT"]=="Y")
            {
                // определение критичности и записи в лог
                if ($_REQUEST["project"])
                {
                    $pitem = GetIBlockElement($_REQUEST["project"]);
                    $LOGTXT .= "<li>проект: ".$pitem["NAME"]."</li>";
                    $project_name = $pitem["NAME"];
                }
                else
                    $project_name = "";
            }
            else
                $project_name = "";
            
            // добавление заявки
            $el = new CIBlockElement;

            $PROP = array();
            $PROP["STATUS"] = $status;
            $PROP["CATEGORY"] = $_REQUEST["category"];
            $PROP["RESPONSIBLE_USER"] = $user;
            $PROP["CRITICALITY"] = $_REQUEST["criticality"];
            $PROP["PROJECT"] = $_REQUEST["project"];
            
//    print_r($PROP);
//    echo "</pre>";

            $arLoadArray = Array(
                "MODIFIED_BY"       => $uid,
                "CREATED_BY"       => $uid,
                "IBLOCK_SECTION"    => false,
                "PROPERTY_VALUES"   => $PROP,
                "IBLOCK_ID"         => $arParams["IBLOCK_REQUESTS_ID"],            
                "NAME"              => $_REQUEST["zag"],
                "ACTIVE"            => "Y",
            );


            if( !($s_id = $el->Add($arLoadArray)) )
                $arResult["ERROR"] = "Ошибка добавления заявки.<br />Попробуйте сделать запрос позднее.<br />";
            else
            {                                
                $new_el = GetIBlockElement($s_id);
                
                // создание элемента сообщения с файлами в ходе исполнения
                $el = new CIBlockElement;
                $PROP = array();
                $PROP["REQUEST"] = $s_id;
                $PROP["TYPE"] = $types["Комментарий"];

                foreach($_FILES as $file)
                {
                    if ($file["error"]==0)
                        $PROP["FILE"][] = $file;
                }
                
                $arLoadArray = Array(
                        "MODIFIED_BY"       => $uid,
                        "CREATED_BY"       => $uid,
                        "IBLOCK_SECTION"    => false,
                        "PROPERTY_VALUES"   => $PROP,
                        "IBLOCK_ID"         => $arParams["IBLOCK_REQUESTS_LOGS_ID"],
                        "NAME"              => "Новая заявка #".$s_id." от пользователя ".$uname,
                        "ACTIVE"            => "Y",
                        "PREVIEW_TEXT"      => $_REQUEST["request"]
                    );
                if (!$el->Add($arLoadArray))
                    echo "Error: ".$el->LAST_ERROR;
                
                // создание системной записи в логе
                if (strlen($LOGTXT))
                {
                    $el = new CIBlockElement;
                    $PROP = array();
                    $PROP["REQUEST"] = $s_id;
                    $PROP["TYPE"] = $types["Системная"];

                    $arLoadArray = Array(
                        "MODIFIED_BY"       => $uid,
                        "CREATED_BY"       => $uid,
                        "PROPERTY_VALUES"   => $PROP,
                        "IBLOCK_ID"         => $arParams["IBLOCK_REQUESTS_LOGS_ID"],
                        "NAME"              => "Системная запись к заявке #".$s_id,
                        "ACTIVE"            => "Y",
                        "PREVIEW_TEXT"      => "<ul>".$LOGTXT."</ul>",
                        "PREVIEW_TEXT_TYPE" => "html"
                    );
                    if (!$el->Add($arLoadArray))
                        echo "Error: ".$el->LAST_ERROR;
                }
                
                // отправка уведомлений всем участникам
                
                $arEventFields = array(
                    "ID"                  => $s_id,
                    "EMAIL_TO"            => $umail,
                    "TITLE"               => $_REQUEST["zag"],
                    "OWNER_NAME"          => $uname,
                    "CATEGORY"            => $cat_name,
                    "CRITICALITY"         => $crit_name,
                    "PROJECT"         => $project_name,
                    "DATE_CREATE"         => $new_el["DATE_CREATE"],
                    "RESPONSIBLE_NAME"    => $resp_name,
                    "FILES_LINKS"         => "",
                    "MESSAGE_BODY"        => $_REQUEST["request"],
                );
                CEvent::Send($arParams["MAIL_TEMPL_PREFIX"]."_NEW_FOR_AUTHOR", "s1", $arEventFields, "N");                
                
                $arEventFields["EMAIL_TO"] = $tp_email;
                $arEventFields["EMAIL_ADMIN_TO"] = $tp_admin_email;
                CEvent::Send($arParams["MAIL_TEMPL_PREFIX"]."_NEW_FOR_TP", "s1", $arEventFields, "N");                
                
                // переход на заявку
                LocalRedirect(str_replace("add/", $s_id.".php", $APPLICATION->GetCurDir()));
            }
        }
        else
            ShowError("Необходимо указать категорию!");
    }
}


// построение справочников

// категории
$arFilter = array(
    "IBLOCK_TYPE" => $arParams["IBLOCK_HANDBOOKS_TYPE"],
    "IBLOCK_ID"=> $arParams["IBLOCK_HANDBOOKS_CATEGORY"],
    "ACTIVE" => "Y",
);
$rsElement = CIBlockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, false, array("ID", "NAME"));
while ($elem = $rsElement->GetNext())
        $arResult["CATEGORY"][$elem["ID"]] = $elem["NAME"];

// критичности
$arFilter = array(
    "IBLOCK_TYPE" => $arParams["IBLOCK_HANDBOOKS_TYPE"],
    "IBLOCK_ID"=> $arParams["IBLOCK_HANDBOOKS_CRITICALITY"],
    "ACTIVE" => "Y",
);
$rsElement = CIBlockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, false, array("ID", "NAME"));
while ($elem = $rsElement->GetNext())
        $arResult["CRITICALITY"][$elem["ID"]] = $elem["NAME"];

if ($arParams["USE_PROJECT"]=="Y")
{
    // проекты
    $arFilter = array(
        "IBLOCK_TYPE" => $arParams["IBLOCK_HANDBOOKS_TYPE"],
        "IBLOCK_ID"=> $arParams["IBLOCK_HANDBOOKS_PROJECT"],
        "ACTIVE" => "Y",
    );
    $rsElement = CIBlockElement::GetList(array("SORT"=>"ASC"), $arFilter, false, false, array("ID", "NAME"));
    while ($elem = $rsElement->GetNext())
            $arResult["PROJECT"][$elem["ID"]] = $elem["NAME"];
}

// если техподдержка - выбор клиентов для поля выбора от кого заявка
if ($arResult["ISADMIN"] || $arResult["ISPERFORMER"])
{
    $clients = CUser::GetList(($by="last_name"), ($order="asc"), array("GROUPS_ID"=>$arParams["GROUP_CLIENTS"]));
    while ($client = $clients->GetNext())
    {
        $arResult["CLIENTS"][] = $client;
    }
}


$this->IncludeComponentTemplate();

//echo "<pre>";
//print_r($arResult);
//echo "</pre>";

$APPLICATION->SetTitle("Новое обращение");
?>
